home *** CD-ROM | disk | FTP | other *** search
/ C/C++ Users Group Library 1996 July / C-C++ Users Group Library July 1996.iso / listings / v_12_02 / gage / expand.c < prev   
C/C++ Source or Header  |  1993-11-12  |  2KB  |  79 lines

  1. /* expand.c */
  2.  
  3. #include <stdio.h>
  4.  
  5. /* Decompress data from input to output */
  6. void expand (FILE *input, FILE *output)
  7. {
  8.   unsigned char left[256], right[256], stack[30];
  9.   short int c, count, i, size;
  10.  
  11.   /* Unpack each block until end of file */
  12.   while ((count = getc(input)) != EOF) {
  13.  
  14.     /* Set left to itself as literal flag */
  15.     for (i = 0; i < 256; i++)
  16.       left[i] = i;
  17.  
  18.     /* Read pair table */
  19.     for (c = 0;;) {
  20.  
  21.       /* Skip range of literal bytes */
  22.       if (count > 127) {
  23.         c += count - 127;
  24.         count = 0;
  25.       }
  26.       if (c == 256) break;
  27.  
  28.       /* Read pairs, skip right if literal */
  29.       for (i = 0; i <= count; i++, c++) {
  30.         left[c] = getc(input);
  31.         if (c != left[c])
  32.           right[c] = getc(input);
  33.       }
  34.       if (c == 256) break;
  35.       count = getc(input);
  36.     }
  37.  
  38.     /* Calculate packed data block size */
  39.     size = 256 * getc(input) + getc(input);
  40.  
  41.     /* Unpack data block */
  42.     for (i = 0;;) {
  43.  
  44.       /* Pop byte from stack or read byte */
  45.       if (i)
  46.         c = stack[--i];     
  47.       else {
  48.         if (!size--) break;
  49.         c = getc(input);
  50.       }
  51.  
  52.       /* Output byte or push pair on stack */
  53.       if (c == left[c])      
  54.         putc(c,output);
  55.       else {
  56.         stack[i++] = right[c];
  57.         stack[i++] = left[c];
  58.       }
  59.     }
  60.   }
  61. }
  62.  
  63. void main (int argc, char *argv[])
  64. {
  65.   FILE *infile, *outfile;
  66.  
  67.   if (argc != 3)
  68.     printf("Usage: expand infile outfile\n");
  69.   else if ((infile=fopen(argv[1],"rb"))==NULL)
  70.     printf("Error opening input %s\n",argv[1]);
  71.   else if ((outfile=fopen(argv[2],"wb"))==NULL)
  72.     printf("Error opening output %s\n",argv[2]);
  73.   else {
  74.     expand(infile,outfile);
  75.     fclose(outfile);
  76.     fclose(infile);
  77.   }
  78. }
  79.